package com.zhuhjay.service.system.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zhuhjay.common.web.model.vo.PageInfoVo;
import com.zhuhjay.service.system.enums.OauthTypeEnum;
import com.zhuhjay.service.system.model.dto.UserPageParamDto;
import com.zhuhjay.service.system.model.dto.UserRegisterDto;
import com.zhuhjay.service.system.model.entity.SystemUser;
import com.zhuhjay.service.system.model.vo.UserInfoVo;

/**
 * <p>
 * 服务类
 * </p>
 *
 * @author Zhuhjay
 * @since 2023-01-11
 */
public interface SystemUserService extends IService<SystemUser> {

    /**
     * 用户注册
     *
     * @param userRegister 信息
     */
    void register(UserRegisterDto userRegister);

    /**
     * 更新用户状态
     *
     * @param userId 用户id
     */
    void updateStatus(Integer userId);

    /**
     * 获取用户信息的分页数据，并且需要获取用户的角色信息
     *
     * @param pageNum  页码
     * @param pageSize 每页数量
     * @param param    查询参数
     * @return 分页数据
     */
    PageInfoVo<UserInfoVo> usersPage(Integer pageNum, Integer pageSize, UserPageParamDto param);

    /**
     * 更改用户角色信息
     *
     * @param userId 用户id
     * @param roleId 角色id
     */
    void updateRole(Integer userId, Integer roleId);

    /**
     * 验证用户的密码是否正确
     *
     * @param password 旧密码
     */
    void checkPassword(String password);

    /**
     * 更新用户密码
     *
     * @param password 新密码
     */
    void updatePassword(String password);

    /**
     * 发送绑定邮件到指定邮箱中
     *
     * @param email 邮箱
     */
    void send2BindEmail(String email);

    /**
     * 发送解绑邮件到指定邮箱中
     */
    void send2UnbindEmail();

    /**
     * 发送重置密码邮件
     *
     * @param user 用户信息
     */
    void send2ResetPwd(SystemUser user);

    /**
     * 重置密码
     *
     * @param userId   用户id
     * @param password 新密码
     */
    void resetPasswordByAdmin(Integer userId, String password);

    /**
     * 更新用户的最后登录时间
     *
     * @param username 用户名
     */
    void updateLastLoginTime(String username);

    /**
     * 获取用户的头像
     *
     * @param username 用户名
     * @return 头像地址
     */
    String getAvatar(String username);

    /**
     * 通过授权类型和openid创建一个新的用户并返回
     *
     * @param oauthTypeEnum 授权类型
     * @param openid        openid
     * @return 用户信息
     */
    SystemUser createAccount(OauthTypeEnum oauthTypeEnum, String openid);

    /**
     * 绑定邮箱
     *
     * @param email 邮箱
     * @param code  验证码
     */
    void bindEmail(String email, String code);

    /**
     * 解绑邮箱
     *
     * @param email 邮箱
     * @param code  验证码
     */
    void unbindEmail(String email, String code);

    /**
     * 通过邮箱重置密码
     *
     * @param email    邮箱
     * @param code     验证码
     * @param password 新密码
     */
    void resetPasswordByEmail(String email, String code, String password);

    /**
     * 从Caffeine缓存中获取创建者名称
     *
     * @param userId 用户id
     * @return 创建者
     */
    String getCreateUserByCaffeine(Integer userId);

}
